package xyz.zyl2020.juc.lock.lock7;

import java.util.concurrent.TimeUnit;

/**
 * 问：如下代码，两个方法谁先输出？
 * 答：先输出 sendMsg，后 call
 * 原因：被 synchronized 修饰的方法，锁的对象是方法调用者。这里一个是静态方法，一个是非静态方法，
 * 锁的对象不同（A线程锁的对象是 Phone.class，B线程锁的对象是 phone 对象），按照休眠时间 sendMsg 会先输出
 */
public class Lock7 {

    public static void main(String[] args) throws InterruptedException {
        Phone phone = new Phone();

        new Thread(() -> {
            phone.call();
        }, "A").start();
        TimeUnit.SECONDS.sleep(1);
        new Thread(() -> {
            phone.sendMsg();
        }, "B").start();
    }

}

class Phone {

    static synchronized void call() {
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("call");
    }

    synchronized void sendMsg() {
        System.out.println("sendMsg");
    }

}